package com.wn.service.impl;

import com.wn.annotion.MyRedis;
import com.wn.pojo.User;
import com.wn.mapper.UserMapper;
import com.wn.service.IUserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.util.List;

/**
 * <p>
 * 服务实现类
 * </p>
 *
 * @author yellow docker
 * @since 2023-06-19
 */
@Slf4j   //日志打印    在lombok 下面的 注解
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {

    @Autowired
    private RedisTemplate redisTemplate;

    public final String USER_REDIS_KEY = "wn:user:all";

    /**
     *
     * @return
     * 1、查询redis 没有数据 查询数据库
     *        Object o = redisTemplate.opsForValue().get(USER_REDIS_KEY);
     * 2、查询数据库
     *        this.list();
     *
     * 3、存储到缓存中
     *       redisTemplate.opsForValue().set(USER_REDIS_KEY,list);
     *
     * 4、返回结果到前端
     */
//    @Override
//    public List<User> listUsers() {
//
//        Object o = redisTemplate.opsForValue().get(USER_REDIS_KEY);
//        //判断  为null   查询数据库
//        if (ObjectUtils.isEmpty(o)){
//
//            //查询数据库
//            List<User> list = this.list();
//
//            //存储到 redis中
//            redisTemplate.opsForValue().set(USER_REDIS_KEY,list);
//            return list;
//        }
//
//        log.info("从缓存中获取数据...");
//
//        return (List<User>) o;
//    }

    /**
     * 使用SpringCache 注解 来解决缓存
     * 1、第一次查询数据库
     * 2、第二次查询缓存 (直接添加注解就可以 )
     *
     * 开启 springcache 的配置
     *
     * @return
     */

    /**
     * 自己实现一个缓存的注解
     * 1、 自定义注解
     *
     * 2、 springaop来解析注解
     * 3、业务逻辑实现
     *
     * @return
     */

//    @Cacheable(value = USER_REDIS_KEY)
    @MyRedis("wn:user:all")
    @Override
    public List<User> listUsers() {
        //查询数据库
        List<User> list = this.list();

        return list;
    }
}
